package log

import (
	"fmt"
	"io"
	"log"
	"os"
	"path/filepath"
	"strings"
	"time"
)

const (
	// 日志文件最大大小 (20MB)
	MaxLogSize = 20 * 1024 * 1024
)

// LogWriter 自定义日志写入器，支持文件大小限制和轮转
type LogWriter struct {
	file     *os.File
	filePath string
	dirPath  string
	baseName string
	fileSize int64
	maxSize  int64
}

// NewLogWriter 创建新的日志写入器
func NewLogWriter() (*LogWriter, error) {
	// 获取用户主目录
	homeDir, err := os.UserHomeDir()
	if err != nil {
		return nil, fmt.Errorf("获取用户主目录失败: %v", err)
	}

	// 创建xswitch目录
	xswitchDir := filepath.Join(homeDir, "xswitch")
	if err := os.MkdirAll(xswitchDir, 0755); err != nil {
		return nil, fmt.Errorf("创建xswitch目录失败: %v", err)
	}

	// 生成日志文件名（包含时间戳）
	timestamp := time.Now().Format("20060102150405")
	baseName := fmt.Sprintf("aistream-%s.log", timestamp)
	filePath := filepath.Join(xswitchDir, baseName)

	// 创建日志文件
	file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		return nil, fmt.Errorf("创建日志文件失败: %v", err)
	}

	// 获取文件信息
	fileInfo, err := file.Stat()
	if err != nil {
		file.Close()
		return nil, fmt.Errorf("获取文件信息失败: %v", err)
	}

	return &LogWriter{
		file:     file,
		filePath: filePath,
		dirPath:  xswitchDir,
		baseName: baseName,
		fileSize: fileInfo.Size(),
		maxSize:  MaxLogSize,
	}, nil
}

// Write 实现io.Writer接口
func (lw *LogWriter) Write(p []byte) (n int, err error) {
	// 检查文件大小是否超过限制
	if lw.fileSize+int64(len(p)) > lw.maxSize {
		// 关闭当前文件
		lw.file.Close()

		// 清理旧日志文件（保留最新的3个）
		lw.cleanupOldLogs()

		// 创建新的日志文件
		timestamp := time.Now().Format("20060102150405")
		newBaseName := fmt.Sprintf("aistream-%s.log", timestamp)
		newFilePath := filepath.Join(lw.dirPath, newBaseName)

		newFile, err := os.OpenFile(newFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
		if err != nil {
			return 0, fmt.Errorf("创建新日志文件失败: %v", err)
		}

		lw.file = newFile
		lw.filePath = newFilePath
		lw.baseName = newBaseName
		lw.fileSize = 0
	}

	// 写入数据
	n, err = lw.file.Write(p)
	if err == nil {
		lw.fileSize += int64(n)
		// 确保数据写入磁盘
		lw.file.Sync()
	}

	return n, err
}

// Close 关闭日志文件
func (lw *LogWriter) Close() error {
	if lw.file != nil {
		return lw.file.Close()
	}
	return nil
}

// GetFilePath 获取当前日志文件路径
func (lw *LogWriter) GetFilePath() string {
	return lw.filePath
}

// GetMaxSize 获取日志文件大小限制
func (lw *LogWriter) GetMaxSize() int64 {
	return lw.maxSize
}

// cleanupOldLogs 清理旧的日志文件，只保留最新的3个
func (lw *LogWriter) cleanupOldLogs() {
	files, err := os.ReadDir(lw.dirPath)
	if err != nil {
		return
	}

	// 收集所有aistream日志文件
	var logFiles []string
	for _, file := range files {
		if !file.IsDir() && strings.HasPrefix(file.Name(), "aistream-") && strings.HasSuffix(file.Name(), ".log") {
			logFiles = append(logFiles, file.Name())
		}
	}

	// 如果文件数量超过3个，删除最旧的
	if len(logFiles) > 3 {
		// 按文件名排序（包含时间戳，所以按字符串排序即可）
		for i := 0; i < len(logFiles)-3; i++ {
			oldFile := filepath.Join(lw.dirPath, logFiles[i])
			os.Remove(oldFile)
		}
	}
}

// InitLogging 初始化日志系统
func InitLogging() (*LogWriter, error) {
	logWriter, err := NewLogWriter()
	if err != nil {
		return nil, err
	}

	// 设置日志输出到文件和控制台
	log.SetOutput(io.MultiWriter(os.Stdout, logWriter))
	log.SetFlags(log.LstdFlags | log.Lshortfile)

	// 记录日志系统初始化信息
	log.Printf("日志系统初始化完成，日志文件: %s", logWriter.filePath)
	log.Printf("日志文件大小限制: %d MB", logWriter.maxSize/(1024*1024))

	return logWriter, nil
}

// SetLogLevel 设置日志级别（预留接口，可根据需要扩展）
func SetLogLevel(level string) {
	// 这里可以根据需要实现不同的日志级别
	// 例如：DEBUG, INFO, WARN, ERROR
}

// GetLogWriter 获取当前的日志写入器实例
func GetLogWriter() *LogWriter {
	// 这个函数可以根据需要实现单例模式
	// 目前返回nil，需要外部管理实例
	return nil
}
